﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloDocumentos;
using Npgsql;
using System.Data;

namespace SIGEB.Modelo.moduloEjemplar
{
    public class conjuntoEjemplares:conjuntoBase
    {
        #region "constructores"

        public conjuntoEjemplares(datosAplicacion dA)
            : base(dA)
        {
            numTipo = conjuntoBase.CONJEJEMPLARES;
        }

        #endregion

        #region "metodos"

        public override object obtenerEstado()
        {
            throw new NotImplementedException();
        }

        #region "imec"

        public void agregarejemplar(ejemplar nuevoEjem)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT registrar_ejemplar('" + nuevoEjem.numAdquisicion + "', '" + nuevoEjem.idDocumento + "', '" + nuevoEjem.fechaIngreso.ToShortDateString()
                    + "', " + nuevoEjem.estado + ")";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch(Exception e)
            {
                throw new Exception(e.Message + "\nError al agregar ejemplar: " + nuevoEjem.numAdquisicion);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void eliminarejemplar(String codejemplar)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT eliminar_ejemplar('" + codejemplar + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch(Exception e)
            {
                throw new Exception(e.Message + "Error al eliminar ejemplar: " + codejemplar);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
        }

        public void modificarejemplar(String codejemplar, ejemplar nuevoEjem)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT registrar_autor('" + codejemplar + "', '" + nuevoEjem.idDocumento + "', '" + nuevoEjem.fechaIngreso
                    + "', " + nuevoEjem.estado + ")";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch
            {
                throw new Exception("Error al modificar ejemplar: " + nuevoEjem.numAdquisicion);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public ejemplar obtenerejemplar(String codejemplar)
        {
            ejemplar nueva = null;
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_ejemplar_id('" + codejemplar + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 4);
                    try
                    {
                        nueva = new ejemplar(valores[0], valores[1], DateTime.Parse(valores[2]), int.Parse(valores[3]));
                    }
                    catch { }
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener ejemplar.");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public LinkedList<ejemplar> obtenerTodos()
        {
            LinkedList<ejemplar> nueva = new LinkedList<ejemplar>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_ejemplar()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 4);
                    try
                    {
                        nueva.AddLast(new ejemplar(valores[0], valores[1], DateTime.Parse(valores[2]), int.Parse(valores[3])));
                    }
                    catch { }
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener ejemplares ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public LinkedList<ejemplar> obtenerByDocumento(string codDocumento)
        {
            LinkedList<ejemplar> nueva = new LinkedList<ejemplar>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_ejemplar_idDocumento('" + codDocumento + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 4);
                    try
                    {
                        nueva.AddLast(new ejemplar(valores[0], valores[1], DateTime.Parse(valores[2]), int.Parse(valores[3])));
                    }
                    catch { }
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener ejemplares ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public void desactivar(string codEjemplar)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT desactivar_ejemplar('" + codEjemplar + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch
            {
                throw new Exception("Error al desactivar ejemplar: " + codEjemplar);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void activarEjemplar(string codigo)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT activar_ejemplar('" + codigo + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch
            {
                throw new Exception("Error al desactivar ejemplar: " + codigo);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        #endregion

        #endregion

    }
}
